2.6 通知
1. 通知是什么?
通知是由事件触发的、集成端可自由定制的单轮交互。比如:
- 手机来电时,发起通知询问用户是否接听来电;
- 流量卡到期时,发起通知询问用户并让用户选择是否续期;
- 电池电量达到提醒阈值时,发起通知询问用户是否导航去附近的充电桩;
- 车胎压力超过设定阈值时,发起通知询问用户是否导航去附近的维修站;
对其概念进行抽象,可得出通知的大体流程如下:
前置事件发生:如接收到来电的事件被触发;
前置事件的处理逻辑主动触发一次单轮的、任务型的交互:
- 包含一句提示语,用于提示用户交互的意图;
- 需设置超时时间、超时再提醒的次数;
- 包含N类选项,每类选项对应一类处理逻辑,选项需要等待用户选择;
- 每类选项至少含有一种对应说法,用于命中该选项;
- 每类选项有且只有一个ID,用于标识该选项
当用户作出选择后,将选项ID反馈给交互发起者;
交互发起者根据当前条件给出反馈文本;
播报反馈文本后停止该次交互;
2. 通知优先级
AiLit要求每条通知都必须设定优先级(默认为 PRIORITY_NORMAL),用于指明通知并发时的入队策略、是否可以打断交互、是否可被唤醒打断、是否需要开主副唤醒等。
入队策略是指当正在处理通知时,集成端发起了一轮新通知,AiLit根据新旧两轮通知的优先级进行决策的凭据。其对应操作种类包括但不限于:新通知入队缓存、停止旧通知处理新通知等。决策矩阵如下:
行:处理中的旧通知 列:新通知 | PRIORITY_NORMAL | PRIORITY_HIGH | PRIORITY_EMERGENCY |
---|---|---|---|
PRIORITY_NORMAL | 新通知入队 | 新通知入队 | 新通知入队 |
PRIORITY_HIGH | 旧通知停止、处理新通知 | 新通知入队 | 新通知入队 |
PRIORITY_EMERGENCY | 旧通知停止、处理新通知 | 旧通知停止、处理新通知 | 新通知入队 |
是否可以打断交互、是否可被唤醒打断、是否需要开主副唤醒等则为产品层面的设定。综合来看,优先级设定如下表:
PRIORITY_NORMAL | PRIORITY_HIGH | PRIORITY_EMERGENCY | |
---|---|---|---|
示例 | 流量卡到期提醒 | 停车场推荐 | 来电 |
入队策略 | 高级等、同级等、低级停 | 高级等、同级等、低级停 | 高级等、同级等、低级停 |
默认超时 | 15s * 1轮 | 15s * 1轮 | 15s * 1轮 |
可打断交互 | × | × | √ |
可被唤醒打断 | √ | × | × |
开主唤醒 | √ | × | × |
开副唤醒 | × | × | × |
开命令唤醒 | × | × | × |
3. 发起通知
当集成端需要发起通知时,首先需构建一份通知(NotificationInfo)实例,每份通知实例可指定任意个数的通知选项(NotificationOption)。示例代码如下:
NotificationInfo notificationInfo = new NotificationInfo.Builder(name + "来电,接听还是取消?")//提示
.setSilenceCnt(3)//超时轮数
.setSilenceTime(8)//每次超时时长(单位:秒)
.setPriority(NotificationInfo.PRIORITY_EMERGENCY)//通知优先级:normal < high < emergency
.addOption(Command.INCOMING_ACCEPT, Arrays.asList(//选项一,接听来电
new GeneralWakeUp("接听","jie ting", "0.127"),//接听来电对应的说法
new GeneralWakeUp("接通","jie tong", "0.127"),//接听来电对应的说法
new GeneralWakeUp("确定","que ding", "0.127"),//接听来电对应的说法
new GeneralWakeUp("接电话","jie dian hua", "0.127")//接听来电对应的说法
)
).addOption(Command.INCOMING_REJECT, Arrays.asList(//选项二,拒接来电
new GeneralWakeUp("拒接","jv jie", "0.127"),//拒接来电对应的说法
new GeneralWakeUp("拒绝","jv jue", "0.127"),//拒接来电对应的说法
new GeneralWakeUp("取消","qv xiao", "0.127"),//拒接来电对应的说法
new GeneralWakeUp("不接","bu jie", "0.127"),//拒接来电对应的说法
)
).build();//完成构建
通知构建好之后,通过以下接口通知AiLit即可完成通知的发起:
// 发起通知
String notifiyId = AiLitContext.getSpeechManager().reportNotification(NotificationInfo, OnNotificationFeedbackListener);
// 取消&打断通知
AiLitContext.getSpeechManager().cancelNotification(notifiyId);